package com.itic.appbase.applications.itext.utils;

import java.awt.Color;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import com.itic.appbase.framework.plugins.logger.Log;
import com.itic.appbase.framework.utils.StringHelper;
import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.Rectangle;
import com.lowagie.text.Table;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.rtf.RtfWriter2;

/**
 * itext生成word工具类
 * <p>Company: itic</p>
 * @author: shijun
 * @date: 2015年6月17日 上午11:08:56
 * @version: V1.0
 */
public class ItextHelper {
    
    private ItextHelper(){
        
    }
    
    
    /**
     * 加载iTextAsian自带中文字体
     * 
     * @return BaseFont
     */
    public static BaseFont loadBaseFont() {
        BaseFont bfChinese = null;
        try {
            bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H",
                    BaseFont.NOT_EMBEDDED);
        } catch (DocumentException e) {
            throw new RuntimeException();
        } catch (IOException e) {
            throw new RuntimeException();
        }
        return bfChinese;
    }
    /**
     * 加载本地字体
     * </br>本地电脑字体,如C:/WINDOWS/Fonts/simkai.ttf 楷体
     * @param localFont
     * @return
     */
    public static BaseFont loadBaseFont(String localFont){
      //使用的是本地电脑的字体
        BaseFont bfChinese = null;
        try {
            bfChinese = BaseFont.createFont(localFont, BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
        } catch (DocumentException e) {
            throw new RuntimeException();
        } catch (IOException e) {
            throw new RuntimeException();
        }  
        return bfChinese;
    }
    /**
     * 设置word中字体样式，不含字体颜色设置
     * @param bf
     *      @see #loadBaseFont()
     * @param size
     * @param style
     * @return
     */
    public static Font setFont(BaseFont bf,float size,int style){
        
        return setFont(bf, size, style, null);
    }
    /**
     * 设置word中字体样式，含字体颜色设置
     * @param bf
     *      @see #loadBaseFont()
     * @param size
     * @param style
     * @return
     */
    public static Font setFont(BaseFont bf,float size,int style,Color color){
        return new Font(bf, size, style, color);
    }
    /**
     * 创建字节输出流
     * @return
     */
    public static ByteArrayOutputStream creatOutputStream(){
        return new ByteArrayOutputStream();
    }
    /**
     * 获取word文档document对象
     * 
     * @param os 输出流
     *      @see #creatOutputStream()
     * @return
     */
    public static Document createDocument(ByteArrayOutputStream os){
        Document document = new Document(PageSize.A4);//设置word的纸张大小 A4纸
        //建立一个书写器(Writer)与document对象关联，
        //通过书写器(Writer)可以将文档写入到磁盘中
        RtfWriter2.getInstance(document, os);
        return document;
    }
    /**
     * 打开文档对象
     * @param document
     */
    public static void openDoucument(Document document){
        document.open();
    }
    /**
     * 关闭文档对象
     * @param document
     */
    public static void closeDocument(Document document){
        document.close();
    }
    
    /**
     * 文档中添加内容
     * @param document
     * @see #createDocument(OutputStream)
     * @param element 如Chunk Phrase Paragraph Cell
     * @return 添加成功true,添加失败false
     * @throws DocumentException
     */
    public static boolean addDocumentElement(Document document,Element element){
        try {
            return document.add(element);
        } catch (DocumentException e) {
            Log.error("文档中加入内容失败", e);
        }
        return false;
    }
    /**
     * 文档内容换行
     * @param document
     * @see #closeDocument(Document)
     */
    public static void contentWrap(Document document){
        addDocumentElement(document, new Paragraph("\n"));
    }
    /**
     * 创建段落
     * @param content 段落内容
     * @param font 字体
     * @see #setFont(BaseFont, float, int, Color)
     * @return Paragraph
     */
    public static Paragraph createParagraph(String content,Font font ){
        return new Paragraph(content, font);
    }
    
    /**
     * 添加word页脚
     * @param document
     *      @see #createDocument(OutputStream)
     * @param footFont
     *      @see #setFont(BaseFont, float, int)
     */
    public static void createHeaderFooter(Document document,Font footFont){
        HeaderFooter footer = new HeaderFooter(new Phrase("第",footFont), new Phrase("页",footFont));      
        footer.setBorder(Rectangle.NO_BORDER);  
        footer.setAlignment(HeaderFooter.ALIGN_LEFT);
        document.setFooter(footer); 
    }
    /**=====================================word表格操作API========================================*/
    /**
     * 创建word表格
     * <p>创建word表格并指定表格列数
     * @param columnNum 列数 
     * @return Table 表格对象
     * @throws BadElementException
     */
    public static Table createTable(Integer columnNum){
        try {
            // 设置 Table 表格
            Table aTable = new Table(columnNum);
            
            aTable.setWidth(98); // 表格占页面宽度 98%

            aTable.setAlignment(Element.ALIGN_CENTER);// 居中显示
            
            aTable.setAlignment(Element.ALIGN_MIDDLE);// 纵向居中显示

            aTable.setAutoFillEmptyCells(true); // 自动填满

            aTable.setBorderWidth(1); // 边框宽度

            aTable.setBorderColor(new Color(0, 125, 255)); // 边框颜色

            aTable.setPadding(2);// 行间距

            aTable.setSpacing(0);// 单元格之间的间距

            aTable.setBorder(2);// 边框
            
            return aTable;
        } catch (BadElementException e) {
            Log.error("创建表格失败", e);
            return null;
        }
    }
    /**
     * 设置word表格每列的宽度
     * @param widths
     * @param table
     *  @see #createTable(Integer)
     * @throws DocumentException
     */
    public static void setTableWidths(int[] widths,Table table){
        int colNum = table.getColumns();//table列数
        if( null != widths && widths.length > 0 && colNum == widths.length){//table列数和配置的列数相等
            try {
                table.setWidths(widths);
            } catch (DocumentException e) {
                Log.error("设置表格宽度失败", e);
            }
        }
    }
    /**
     * word表格跨页时冻结表头
     * @param lastHeaderRow 表头的最后一行索引 
     * @param table
     * @see #createTable(Integer)
     */
    public static void freezeHead(int lastHeaderRow,Table table){
        table.setLastHeaderRow(lastHeaderRow);
    }
    /**
     * word表格中添加单元格
     * @param table
     * @param cell
     */
    public static void addTableCell(Table table,Cell cell){
        table.addCell(cell);
    }
    
    /**
     * 创建空的单元格
     * @return Cell
     */
    public static Cell createCell(){
        return new Cell();
    }
    /**
     * 创建只含有文本的的单元格
     * @param content 文本内容
     * @return Cell
     */
    public static Cell createCell(String content){
        if(StringHelper.isNotBlank(content)){
            return new Cell(content);
        }else{
            return createCell();
        }
    }
    
    /**
     * 创建含有element的单元格
     * @param element 如Chunk Phrase Paragraph
     * @return Cell
     * @throws BadElementException
     */
    public static Cell createCell(Element element){
        if(null==element){
            return createCell();
        }else{
            try {
                return new Cell(element);
            } catch (BadElementException e) {
                Log.error("创建单元格失败", e);
            }
            return null;
        }
    }
    
    /**
     * 输出word流
     * @param ba 文档流
     * @param document 文档操作对象
     * @param out 输出流
     * @throws IOException
     */
    public static void wordWriter(ByteArrayOutputStream ba,Document document,OutputStream out) throws IOException{
            closeDocument(document);//关闭word文档
            ba.writeTo(out);
    }
}
